package com.ljc.service;


import com.ljc.entity.File;
import com.ljc.interfaces.FileApi;
import com.ljc.utils.FastDFSUtil;
import com.ljc.utils.MD5Util;
import io.netty.util.internal.StringUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.Date;

@Service
public class FileService {

    @DubboReference
    private FileApi fileApi;

    @Resource
    private FastDFSUtil fastDFSUtil;

    /**
     * 分片上传文件
     */
    public String uploadFileBySlices(MultipartFile slice,
                                     String fileMD5,
                                     Integer sliceNo,
                                     Integer totalSliceNo) throws Exception {
        // 通过md5到数据库中查找文件
        File dbFileMD5 = fileApi.getFileByMD5(fileMD5);
        if (dbFileMD5 != null) {
            return dbFileMD5.getUrl();
        }
        // 如果没有找到，说明没有上传过同样的文件，准备以断点续传方式上传文件
        String url = fastDFSUtil.uploadFileBySlices(slice, fileMD5, sliceNo, totalSliceNo);
        if (!StringUtil.isNullOrEmpty(url)) {
            dbFileMD5 = new File();
            dbFileMD5.setCreateTime(new Date());
            dbFileMD5.setMd5(fileMD5);
            dbFileMD5.setUrl(url);
            dbFileMD5.setType(fastDFSUtil.getFileType(slice));
            // 将上传好的文件的md5、url等信息保存到数据库
            fileApi.addFile(dbFileMD5);
        }
        return url;
    }

    public String getFileMD5(MultipartFile file) throws Exception {
        return MD5Util.getFileMD5(file);
    }

    public File getFileByMd5(String fileMd5) {
        return fileApi.getFileByMD5(fileMd5);
    }
}
